package com.example;

import com.example.mq.RocketMqConsumerService;
import com.example.mq.RocketMqProducer;
import com.example.raft.SimulationEnv;
import com.example.scheduler.*;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * AppMain：主程序入口，用于演示调度器与执行器的启动，以及DAG任务的提交
 */
public class AppMain {
    public static void main(String[] args) throws Exception {
        // 1) 启动 Producer（模拟）
        RocketMqProducer producer = new RocketMqProducer();
        producer.start();

        // 2) 启动 ConsumerService（模拟）
        RocketMqConsumerService consumerSvc = new RocketMqConsumerService();

        // 3) 创建执行器
        // 这里仅创建一个执行器 Executor-1，用于承接任务
        // 在真实环境中，可创建多个执行器并加入调度器节点
        TaskExecutor executor = new TaskExecutor("Executor-1", producer, consumerSvc, null);
        executor.startWorking();

        // 4) 创建调度器节点 (假设Raft只有一个Leader节点)
        SchedulerNode scheduler = new SchedulerNode(
                "Scheduler-1",
                List.of(),       // 不同peerIds可在此处指定
                producer,
                consumerSvc,
                List.of(executor)
        );
        // 将调度器注册到模拟环境
        SimulationEnv.registerNode(scheduler);

        // 5) 启动调度器的MQ消费者(监听RESULT_TOPIC)
        scheduler.startScheduler();

        // ============ 流程1：调度一个普通任务 ============
        System.out.println("\n=== Submit a Normal Task ===");
        scheduler.scheduleTask("job123");

        // ============ 流程2：调度一个DAG任务，使用默认模板1 ============
        System.out.println("\n=== Submit a DAG Task (using DAGTEMPLATE_1) ===");
        // 从DagTemplateManager获取DAGTEMPLATE_1
        DagTemplate template1 = DagTemplateManager.getTemplateById("DAG_1");
        // 提交一次DAG任务
        scheduler.scheduleDag("dag001", template1);

        // ============ 流程3：再调度一个DAG任务，使用默认模板2 ============
        System.out.println("\n=== Submit another DAG Task (using DAGTEMPLATE_2) ===");
        DagTemplate template2 = DagTemplateManager.getTemplateById("DAG_2");
        scheduler.scheduleDag("dag002", template2);

        // 等待若干秒，让任务执行完
        Thread.sleep(10000);

        // 6) 关闭所有组件
        executor.shutdown();
        scheduler.stopScheduler();
        scheduler.stopNode();
        producer.shutdown();
        SimulationEnv.clear();

    }
}